/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.controlador;

import com.ec.medical.entidades.DivisionGeografica;
import com.ec.medical.entidades.Perfil;
import com.ec.medical.entidades.Usuario;
import com.ec.medical.enumeracion.RolesEnum;
import com.ec.medical.servicio.DivisionGeograficaServicioLocal;
import com.ec.medical.servicio.PerfilServicioLocal;
import com.ec.medical.servicio.UsuarioServicioLocal;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;

/**
 *
 * @author Administrador
 */
@ManagedBean
@RequestScoped
public class SeleccionRolControlador extends ControladorBase {

    private Logger LOG = Logger.getLogger(SeleccionRolControlador.class.getName());
    private int codigoRolSeleccionado;
    @EJB
    private UsuarioServicioLocal usuarioServicio;
    @EJB
    private PerfilServicioLocal perfilServicio;
    @EJB
    private DivisionGeograficaServicioLocal divisionGeograficaServicio;
    Map<Integer, String> direccionamientoRoles = new HashMap<Integer, String>();

    {
        direccionamientoRoles.put(RolesEnum.ADMINISTRADOR.ordinal(), "moduloAdministracion/paginas/principalAdministracion.xhtml");
        direccionamientoRoles.put(RolesEnum.RECEPCION.ordinal(), "moduloRecepcion/paginas/principalRecepcion.xhtml");
        direccionamientoRoles.put(RolesEnum.PRESTADOR.ordinal(), "moduloPrestador/paginas/principalPrestador.xhtml");

    }

    /**
     * Creates a new instance of SeleccionRolControlador
     */
    public SeleccionRolControlador() {
    }

    public List<SelectItem> getRolDeUsuario() {
        List<RolesEnum> rolesHabilitados = new ArrayList<RolesEnum>();
        RolesEnum[] roles = RolesEnum.values();
        for (int i = 0; i < roles.length; i++) {
            if (isUserInRol(roles[i])) {
                rolesHabilitados.add(roles[i]);
            }
        }

        return generarItems(rolesHabilitados);
    }

    /**
     * MEtodo que direcciona al modulo seleccionado por el usuario
     */
    public void seleccionarRol() {
        String direccion = direccionamientoRoles.get(getCodigoRolSeleccionado());
        identificarDivisionGeografica(getCodigoRolSeleccionado());
        try {
            ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
            ec.redirect(direccion);
        } catch (IOException ex) {
            imprimirLogError(" Error al desloguear " + ex);
        }
    }

    /*
     * Metodo que obtiene la division geografica en base al rol del usuario logueado
     */
    private void identificarDivisionGeografica(int rolSeleccionado) {
        RolesEnum[] roles = RolesEnum.values();
        iter:
        for (int i = 0; i < roles.length; i++) {
            if (rolSeleccionado == roles[i].ordinal()) {
                Usuario usuario = usuarioServicio.obtenerUsuarioPorUserName(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser());
                Perfil perfil = perfilServicio.obtenerPerfilPorUsuarioYRol(usuario, roles[i]);

                if (perfil.getRol().getIdentificador().equals(RolesEnum.PRESTADOR.getIdentificador())) {
                    DivisionGeografica divGeografica = perfil.getPrestador().getDivisionGeografica();
                    sesionDataManager.setDivisionGeografica(divisionGeograficaServicio.obtenerDivisionGeograficaPadre(divGeografica));
                } else {

                    sesionDataManager.setDivisionGeografica(divisionGeograficaServicio.obtenerDivisionGeograficaPadre(usuario.getDivisionGeografica()));
                }
                break iter;
            }
        }
    }

    @Override
    protected void imprimirLogInfo(String mensaje) {
        LOG.info(mensaje);
    }

    @Override
    protected void imprimirLogError(String mensaje) {
        LOG.error(mensaje);
    }

    public int getCodigoRolSeleccionado() {
        return codigoRolSeleccionado;
    }

    public void setCodigoRolSeleccionado(int codigoRolSeleccionado) {
        imprimirLogInfo("setCodigoRolSeleccionado " + codigoRolSeleccionado);
        this.codigoRolSeleccionado = codigoRolSeleccionado;
    }

    @Override
    public void iniciarDatos() {
        imprimirLogInfo("iniciarDatos");
    }
}
